module.exports = function (hljs) {
  return {
    contains: [
      hljs.HASH_COMMENT_MODE,
      hljs.C_LINE_COMMENT_MODE,
      hljs.C_BLOCK_COMMENT_MODE,
      {
        begin: hljs.UNDERSCORE_IDENT_RE,
        lexemes: hljs.UNDERSCORE_IDENT_RE,
        keywords: {
          // Stan's keywords
          name:
            'for in while repeat until if then else',
          // Stan's probablity distributions (less beta and gamma, as commonly
          // used for parameter names). So far, _log and _rng variants are not
          // included
          symbol:
            'bernoulli bernoulli_logit binomial binomial_logit ' +
            'beta_binomial hypergeometric categorical categorical_logit ' +
            'ordered_logistic neg_binomial neg_binomial_2 ' +
            'neg_binomial_2_log poisson poisson_log multinomial normal ' +
            'exp_mod_normal skew_normal student_t cauchy double_exponential ' +
            'logistic gumbel lognormal chi_square inv_chi_square ' +
            'scaled_inv_chi_square exponential inv_gamma weibull frechet ' +
            'rayleigh wiener pareto pareto_type_2 von_mises uniform ' +
            'multi_normal multi_normal_prec multi_normal_cholesky multi_gp ' +
            'multi_gp_cholesky multi_student_t gaussian_dlm_obs dirichlet ' +
            'lkj_corr lkj_corr_cholesky wishart inv_wishart',
          // Stan's data types
          'selector-tag':
            'int real vector simplex unit_vector ordered positive_ordered ' +
            'row_vector matrix cholesky_factor_corr cholesky_factor_cov ' +
            'corr_matrix cov_matrix',
          // Stan's model blocks
          title:
            'functions model data parameters quantities transformed ' +
            'generated',
          literal:
            'true false'
        },
        relevance: 0
      },
      // The below is all taken from the R language definition
      {
        // hex value
        className: 'number',
        begin: '0[xX][0-9a-fA-F]+[Li]?\\b',
        relevance: 0
      },
      {
        // hex value
        className: 'number',
        begin: '0[xX][0-9a-fA-F]+[Li]?\\b',
        relevance: 0
      },
      {
        // explicit integer
        className: 'number',
        begin: '\\d+(?:[eE][+\\-]?\\d*)?L\\b',
        relevance: 0
      },
      {
        // number with trailing decimal
        className: 'number',
        begin: '\\d+\\.(?!\\d)(?:i\\b)?',
        relevance: 0
      },
      {
        // number
        className: 'number',
        begin: '\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d*)?i?\\b',
        relevance: 0
      },
      {
        // number with leading decimal
        className: 'number',
        begin: '\\.\\d+(?:[eE][+\\-]?\\d*)?i?\\b',
        relevance: 0
      }
    ]
  }
}
